home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
sxpsm03
/
sxpsm03.lzh
/
SOURCE
/
psm.has
< prev
next >
Wrap
Text File
|
1997-05-26
|
13KB
|
681 lines
.include iocscall.mac
.include doscall.mac
PORT_A equ $e9a001
PORT_B equ $e9a003
PORT_C equ $e9a005
PORT_CTRL equ $e9a007
PS_SEL equ 0
PS_CLK equ 1
PS_CMD equ 2
PS_DASEL equ 3
.xdef _psm_init
.xdef _psm_end
.xdef _psm_mctype
.xdef _psm_bread
.xdef _psm_bwrite
* オフセット設定~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.offset 4 * ローカルエリア = a6
retry: .ds.l 1 * リトライ回数
a6offset:
.offset 8 * C言語との引き数の受け渡し
blkadr: .ds.l 1 * ブロックアドレス
flnumber: .ds.l 1 * 読み込むフレーム数
waittime: .ds.l 1 * 大ウエイト
waittime2: .ds.l 1 * 小ウエイト
psmaddress: .ds.l 1 * 格納アドレス
waittime3: .ds.l 1 * 新ウエイト
.offset 8 * C言語との引き数の受け渡し
localmem: .ds.l 1
.offset 8 * C言語との引き数の受け渡し
portuse: .ds.l 1
.text
.even
* サブルーチン~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* ポート設定
_psm_init:
link a6,#-a6offset
movem.l d3-d7/a3-a5,-(sp)
clr.l -(sp)
DOS _SUPER
addq.l #4,sp
tst.l (portuse,a6) * 使用ポート設定
bne @f
move.l #PORT_A,portadr * 初期化する
move.w #4,w1+2
move.w #4,w2+2
move.b #%1000_1010,PORT_CTRL
move.b #%0000_1000,PORT_A
bra 1f
@@: move.l #PORT_B,portadr * 初期化する
move.w #5,w1+2
move.w #5,w2+2
move.b #%1001_1000,PORT_CTRL
move.b #%0000_1000,PORT_B
1: move.l d0,-(sp)
DOS _SUPER
addq.l #4,sp
movem.l (sp)+,d3-d7/a3-a5
unlk a6
rts
portadr: .dc.l PORT_A * 使用ポートアドレス
* サブルーチン~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* ポート設定解除
_psm_end:
movem.l d3-d7/a3-a5,-(sp)
clr.l -(sp)
DOS _SUPER
addq.l #4,sp
move.b #%1001_0010,PORT_CTRL * 初期化する
move.b #%0000_1000,PORT_CTRL
move.l d0,-(sp)
DOS _SUPER
addq.l #4,sp
movem.l (sp)+,d3-d7/a3-a5
rts
* サブルーチン~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* メモリタイプ選定
* out: 1=new type 0=old type
_psm_mctype:
link a6,#-a6offset
movem.l d3-d7/a3-a5,-(sp)
move.l portadr,a4
moveq #0,d2
lea typedat,a1
bsr psm_fread
clr.l d0 * old type
tst.b d3
beq @f
moveq #1,d0 * new type
@@: move.b #%0000_1000,(a4) * 正常終了
move.w d0,mctype
movem.l (sp)+,d3-d7/a3-a5
unlk a6
rts
typedat: .ds.b 128
.even
mctype: .dc.w 0
* サブルーチン~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* メモリカードから1ブロック読み込む
_psm_bread:
link a6,#-a6offset
movem.l d3-d7/a3-a5,-(sp)
move.l portadr,a4
move.w #6,(-retry,a6) * 初期設定
move.l (flnumber,a6),d4 * 1ブロック読み出す
move.l (blkadr,a6),d5
clr.w d7
movea.l (psmaddress,a6),a1
tst.w mctype * メモリカードのタイプ判定
bne 2f
* old type のメモリカード処理
1: move.w #$2e,d1
@@: *IOCS _B_PUTC
addq.w #1,d7
move.w d5,d2
bsr psm_fread
tst.b d3
beq @f
move.b #%0000_1000,(a4) * エラー発生・・・やりなおし
move.l (waittime,a6),d0
addi.l #200,d0
move.l d0,(waittime,a6)
move.l (waittime2,a6),d0
addi.l #20,d0
move.l d0,(waittime2,a6)
subq.w #1,(-retry,a6)
ble emstop
move.w #$65,d1
bra @b
@@: adda.l #128,a1 * 次のフレーム準備
addq.l #1,d5
dbra d4,1b
@@: move.b d7,d1 * 文字消去
* IOCS _B_DEL
move.b #%0000_1000,(a4) * 正常終了
move.l (psmaddress,a6),d0
movem.l (sp)+,d3-d7/a3-a5
unlk a6
rts
2: * new type のメモリカード処理
1: move.w #$2e,d1
@@: *IOCS _B_PUTC
addq.w #1,d7
move.w d5,d2
bsr psm_fread2
tst.b d3
beq @f
move.b #%0000_1000,(a4) * エラー発生・・・やりなおし
move.l (waittime,a6),d0
addi.l #200,d0
move.l d0,(waittime,a6)
move.l (waittime2,a6),d0
addi.l #20,d0
move.l d0,(waittime2,a6)
subq.w #1,(-retry,a6)
ble emstop
move.w #$65,d1
bra @b
@@: adda.l #128,a1 * 次のフレーム準備
addq.l #1,d5
dbra d4,1b
@@: move.b d7,d1 * 文字消去
* IOCS _B_DEL
move.b #%0000_1000,(a4) * 正常終了
move.l (psmaddress,a6),d0
movem.l (sp)+,d3-d7/a3-a5
unlk a6
rts
* サブルーチン~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* メモリカードから1フレーム読み込む [old type]
* d2.w アドレス
* a1.l データ格納アドレス
* d3.b 終了フラグ(0=正常)
psm_fread:
movem.l d4-d7/a1,-(sp)
move.b #%0000_0001,(a4) * セレクトON
move.b #$81,d0 * コマンドヘッダ
bsr transport_byte
bsr wait_time2
move.b #$52,d0
bsr transport_byte
bsr wait_time2
move.b #$00,d0
bsr transport_byte
bsr wait_time2
move.b #$00,d0
bsr transport_byte
bsr wait_time2
ror.w #8,d2
move.b d2,d0 * アドレス(上位)
bsr transport_byte
bsr wait_time2
ror.w #8,d2
move.b d2,d0 * アドレス(下位)
bsr transport_byte
bsr wait_time2
move.b #$00,d0 * コマンド応答
bsr transport_byte
bsr wait_time
bsr transport_byte * データヘッダ
bsr wait_time2
clr.b d3
bsr transport_byte * データアドレス(上位)
bsr wait_time2
eor.b d1,d3
bsr transport_byte * データアドレス(下位)
bsr wait_time2
eor.b d1,d3
move.w #127,d2
tst.l (waittime2,a6)
blt 1f
@@: bsr transport_byte * データブロック(ウエイトあり)
bsr wait_time2
move.b d1,(a1)+
eor.b d1,d3
dbra d2,@b
bra 2f
1: bsr transport_byte * データブロック(ウエイトなし)
move.b d1,(a1)+
eor.b d1,d3
dbra d2,1b
2: bsr transport_byte * XORフラグ
bsr wait_time
eor.b d1,d3
bsr transport_byte * 終了フラグ
bsr wait_time2
move.b #%0000_1000,(a4) * セレクトOFF
movem.l (sp)+,d4-d7/a1
rts
* サブルーチン~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* メモリカードから1フレーム読み込む [new type]
* d2.w アドレス
* a1.l データ格納アドレス
* d3.b 終了フラグ(0=正常)
psm_fread2:
movem.l d4-d7/a1,-(sp)
move.b #%0000_0001,(a4) * セレクトON
bsr wait_time
bsr wait_time
move.b #$81,d0 * コマンドヘッダ
bsr transport_byte2
bsr wait_time2
move.b #$52,d0
bsr transport_byte2
bsr wait_time2
move.b #$00,d0
bsr transport_byte2
bsr wait_time2
move.b #$00,d0
bsr transport_byte2
bsr wait_time2
ror.w #8,d2
move.b d2,d0 * アドレス(上位)
bsr transport_byte2
bsr wait_time2
ror.w #8,d2
move.b d2,d0 * アドレス(下位)
bsr transport_byte2
bsr wait_time2
move.b #$00,d0 * コマンド応答
bsr transport_byte2
bsr wait_time
bsr transport_byte2 * データヘッダ
bsr wait_time2
clr.b d3
bsr transport_byte2 * データアドレス(上位)
bsr wait_time2
eor.b d1,d3
bsr transport_byte2 * データアドレス(下位)
bsr wait_time2
eor.b d1,d3
move.w #127,d2
tst.l (waittime2,a6)
blt 1f
@@: bsr transport_byte2 * データブロック(ウエイトあり)
bsr wait_time2
move.b d1,(a1)+
eor.b d1,d3
dbra d2,@b
bra 2f
1: bsr transport_byte2 * データブロック(ウエイトなし)
move.b d1,(a1)+
eor.b d1,d3
dbra d2,1b
2: bsr transport_byte2 * XORフラグ
bsr wait_time
eor.b d1,d3
bsr transport_byte2 * 終了フラグ
bsr wait_time2
move.b #%0000_1000,(a4) * セレクトOFF
movem.l (sp)+,d4-d7/a1
rts
* サブルーチン~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* メモリカードから1ブロック書き込む
_psm_bwrite:
link a6,#-a6offset
movem.l d3-d7/a3-a5,-(sp)
move.l portadr,a4
move.w #6,(-retry,a6) * 初期設定
move.l (flnumber,a6),d4 * 1ブロック書き込む
move.l (blkadr,a6),d5
clr.w d7
movea.l (psmaddress,a6),a1
tst.w mctype * メモリカードのタイプ判定
bne 2f
* old type のメモリカード処理
1: move.w #$2e,d1
@@: *IOCS _B_PUTC
addq.w #1,d7
move.w d5,d2
bsr psm_fwrite
.rept 5
bsr wait_time
.endm
tst.b d3
beq @f
move.b #%0000_1000,(a4) * エラー発生・・・やりなおし
move.l (waittime,a6),d0
addi.l #400,d0
move.l d0,(waittime,a6)
move.l (waittime2,a6),d0
addi.l #40,d0
move.l d0,(waittime2,a6)
subq.w #1,(-retry,a6)
ble emstop
move.w #$65,d1
bra @b
@@: adda.l #128,a1 * 次のフレーム準備
addq.l #1,d5
dbra d4,1b
@@: move.b d7,d1 * 文字消去
* IOCS _B_DEL
move.b #%0000_1000,(a4) * 正常終了
move.l (psmaddress,a6),d0
@@: movem.l (sp)+,d3-d7/a3-a5
unlk a6
rts
2: * new type のメモリカード処理
1: move.w #$2e,d1
@@: *IOCS _B_PUTC
addq.w #1,d7
move.w d5,d2
bsr psm_fwrite2
.rept 5
bsr wait_time
.endm
tst.b d3
beq @f
move.b #%0000_1000,(a4) * エラー発生・・・やりなおし
move.l (waittime,a6),d0
addi.l #400,d0
move.l d0,(waittime,a6)
move.l (waittime2,a6),d0
addi.l #40,d0
move.l d0,(waittime2,a6)
subq.w #1,(-retry,a6)
ble emstop
move.w #$65,d1
bra @b
@@: adda.l #128,a1 * 次のフレーム準備
addq.l #1,d5
dbra d4,1b
@@: move.b d7,d1 * 文字消去
* IOCS _B_DEL
move.b #%0000_1000,(a4) * 正常終了
move.l (psmaddress,a6),d0
@@: movem.l (sp)+,d3-d7/a3-a5
unlk a6
rts
emstop: clr.l d0 * 異常終了
bra @b
* サブルーチン~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* メモリカードから1フレーム書き込む
* d2.w アドレス
* a1.l データ格納アドレス
* d3.b 終了フラグ(0=正常)
psm_fwrite:
movem.l d4-d7/a1,-(sp)
move.b #%0000_0001,(a4) * セレクトON
move.b #$81,d0 * コマンドヘッダ
bsr transport_byte
bsr wait_time2
move.b #$57,d0
bsr transport_byte
bsr wait_time2
move.b #$00,d0
bsr transport_byte
bsr wait_time2
move.b #$00,d0
bsr transport_byte
bsr wait_time2
clr.b d3
ror.w #8,d2
move.b d2,d0 * アドレス(上位)
eor.b d0,d3
bsr transport_byte
bsr wait_time2
ror.w #8,d2
move.b d2,d0 * アドレス(下位)
eor.b d0,d3
bsr transport_byte
bsr wait_time2
move.w #127,d2
tst.l (waittime2,a6)
blt 1f
@@: move.b (a1)+,d0 * データブロック(ウエイトあり)
eor.b d0,d3
bsr transport_byte
bsr wait_time2
dbra d2,@b
bra 2f
1: move.b (a1)+,d0 * データブロック(ウエイトなし)
eor.b d0,d3
bsr transport_byte
dbra d2,1b
2: move.b d3,d0 * XORフラグ
bsr transport_byte
bsr wait_time2
move.b #$00,d0 * 終了ステータス
bsr transport_byte
bsr wait_time2
move.b #$00,d0
bsr transport_byte
bsr wait_time2
move.b #$00,d0 * 終了フラグ
bsr transport_byte
bsr wait_time
move.b d1,d3
eor.b #$47,d3
move.b #%0000_1000,(a4) * セレクトOFF
movem.l (sp)+,d4-d7/a1
rts
* サブルーチン~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* メモリカードから1フレーム書き込む
* d2.w アドレス
* a1.l データ格納アドレス
* d3.b 終了フラグ(0=正常)
psm_fwrite2:
movem.l d4-d7/a1,-(sp)
move.b #%0000_0001,(a4) * セレクトON
bsr wait_time
bsr wait_time
move.b #$81,d0 * コマンドヘッダ
bsr transport_byte2
bsr wait_time2
move.b #$57,d0
bsr transport_byte2
bsr wait_time2
move.b #$00,d0
bsr transport_byte2
bsr wait_time2
move.b #$00,d0
bsr transport_byte2
bsr wait_time2
clr.b d3
ror.w #8,d2
move.b d2,d0 * アドレス(上位)
eor.b d0,d3
bsr transport_byte2
bsr wait_time2
ror.w #8,d2
move.b d2,d0 * アドレス(下位)
eor.b d0,d3
bsr transport_byte2
bsr wait_time2
move.w #127,d2
tst.l (waittime2,a6)
blt 1f
@@: move.b (a1)+,d0 * データブロック(ウエイトあり)
eor.b d0,d3
bsr transport_byte2
bsr wait_time2
dbra d2,@b
bra 2f
1: move.b (a1)+,d0 * データブロック(ウエイトなし)
eor.b d0,d3
bsr transport_byte2
dbra d2,1b
2: move.b d3,d0 * XORフラグ
bsr transport_byte2
bsr wait_time2
move.b #$00,d0 * 終了ステータス
bsr transport_byte2
bsr wait_time2
move.b #$00,d0
bsr transport_byte2
bsr wait_time2
move.b #$00,d0 * 終了フラグ
bsr transport_byte2
bsr wait_time
move.b d1,d3
eor.b #$47,d3
move.b #%0000_1000,(a4) * セレクトOFF
movem.l (sp)+,d4-d7/a1
rts
* サブルーチン~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 1バイトのコマンド転送を行なうと同時にデータ入力する
* d0.b コマンド(出力)
* d1.b データ(入力)
transport_byte:
movem.l d2-d5,-(sp)
moveq #7,d2
moveq #0,d5
moveq #0,d1
2: btst d5,d0 * CMD 設定
beq @f
move.b #%0000_0011,(a4) * SEL = L : CMD = X : CLK = L : DAT = X
moveq #%0000_0001,d3
bra 1f
@@: move.b #%0000_0111,(a4) * SEL = L : CMD = X : CLK = L : DAT = X
moveq #%0000_0101,d3
1: * ウエイト
move.b PORT_C,d4 * DAT 入力
w1: btst #4,d4
beq @f
bset d5,d1
@@: addq.w #1,d5
move.b d3,(a4) * SEL = L : CMD = X : CLK = H : DAT = X
dbra d2,2b * 8ビット行なう
movem.l (sp)+,d2-d5
rts
* サブルーチン~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 1バイトのコマンド転送を行なうと同時にデータ入力する
* d0.b コマンド(出力)
* d1.b データ(入力)
transport_byte2:
movem.l d2-d5,-(sp)
moveq #7,d2
moveq #0,d5
moveq #0,d1
2: btst d5,d0 * CMD 設定
beq @f
move.b #%0000_0011,(a4) * SEL = L : CMD = X : CLK = L : DAT = X
moveq #%0000_0001,d3
bra 1f
@@: move.b #%0000_0111,(a4) * SEL = L : CMD = X : CLK = L : DAT = X
moveq #%0000_0101,d3
1: bsr wait_time3 * ウエイト
move.b PORT_C,d4 * DAT 入力
w2: btst #4,d4
beq @f
bset d5,d1
@@: addq.w #1,d5
move.b d3,(a4) * SEL = L : CMD = X : CLK = H : DAT = X
dbra d2,2b * 8ビット行なう
movem.l (sp)+,d2-d5
rts
* サブルーチン~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* ウエイト
wait_time:
move.l (waittime,a6),d6
@@: subq.l #1,d6
bgt @b
rts
wait_time2:
move.l (waittime2,a6),d6
@@: dbra d6,@b
rts
wait_time3:
move.l (waittime3,a6),d6
@@: dbra d6,@b
rts
.end